Spring Web model-view-controller(MVC)框架围绕DispatcherServlet
设计,它将请求派发给处理器,可配置的处理器映射,视图解析器,本地化,时区和主题解析以及对上传问价你的支持。默认的处理器基于@Controller
和@RequestMapping
注解,提供了广泛灵活的处理方法。Spring 3.0起,@Controller
机制允许你通过@PathVariable
注解和其他特性创建RESTful的网站和应用。
开放封闭远策(对拓展开放,对修改关闭)在Spring Web MVC和Spring中是一个重要的设计原则,
Spring Web MVC中一些核心类的方法被标记为了final
。作为一个开发者,你无法覆盖这些方法去支持你自己的卫星。这么做不是很随意的,而是专门针对这个原则考虑的。
为了解释这个原则,请参考Seth Ladd和其他写的Expert Spring Web MVC和Web MVC;尤其是看"A Look At Design"这节,它在第一版的117页。另外可以看
* Bob Martin, The Open-Closed Principle(PDF)
在你使用Spring MVC的时候,你不能为final的方法添加通知。比如,你不能给AbstractController.setSynchronizeOnSession()
方法添加通知。查看11.6.1,"Understanding AOP proxies"获得更多关于AOP代理和为什么无法为final方法添加通知的信息。
在Spring Web MVC,你可以使用任何对象作为命令或是形式支持对象;你不需要实现框架特定的接口或是基类。Spring的数据绑定是高度灵活的:比如,它将类型不匹配作为校验错误,由应用程序来评估,而非作为系统错误。因此你不再需要将你的业务对象的属性作为表单对象的简单的,无类型的字符串,而这么做仅仅时为了处理无效的提交或是正确的转换字符串。相反,通常直接绑定你的业务对象更为可取。
Spring的视图解析也相当灵活。Controller
通常负责准备好一个带有数据和所选择的视图的模型Map
,但它也可以直接写响应的流来完成请求。视图名字解析是高可配性的,可以通过文件拓展,或接受的请求头类型的引导,通过bean的名字,一个属性文件,甚至是自定义的ViewResolver
实现。模型(MVC中的M)是一个Map
接口,它允许视图技术的完全抽象。你可以继承直接基于模板渲染的技术,比如JSP,Velocity和Freemarker,或是直接由XML,JSON,Atom和其他内容类型产生。模型Map
可以被简单的转成合适的类型,比如JSP请求事属性,或是Velocity模板模型。
Spring Web Flow(SWF)目标时为了找到对web应用页面流管理最好的解决方案。
无论在Servlet和Protlet环境中,SWF都可以和现有的框架像Spring MVC和JSF集成。如果你有一个业务流程(或多个流程)可以从对话形式的模型中获益,而不是纯粹的请求模式,那么SWF可能就是解决方案。
SWF允许你将逻辑页面流作为独立的模块捕获,这些页面可以在不同的情况下被重用,因此非常适合用来构建可以通过可控的导航来指引用户驱动业务流程的web应用程序。
更多关于SWF的信息,查看Spring Web Flow website。
Spring的web模块包含了许多独特的web支持特性:
角色间明确区分。每个角色——控制器,校验器,命令对象,表单对象,模型对象,DispatcherServlet
,处理器映射,视图解析器等等——都有专门的对象来实现。
强大而直接的框架和应用程序类的配置,如JavaBeans。 此配置功能包括跨上下文的简单引用,例如从Web控制器到业务对象和验证程序。
适配性,非侵入性和灵活性。可以定义你需要的任何控制器的方法签名,可以使用某一些参数注解(比如@RequestParam, @RequestHeader,@PathVariable或其他)来表达一个语义。
可重用的业务代码,不需要复制。使用现有的业务对象作为命令或是表单对象,而不是复制它们来拓展特定框架的基类。
可定义的数据绑定和校验。类型不匹配,比如像应用程序级别的校验错误,可以持有冲突的值,本地化的日期,和数字绑定等等,而不是手动将只含有字符串属性的表单对象解析转换成业务对象。
可定义的处理器映射和视图解析。处理器映射和视图解析策略可以由简单的基于URL的配置,到复杂的,专门的解析策略。Spring比要求特定技术的web框架更加灵活。
灵活的模型转换器。以名字/属性的Map
模型转换器支持轻易的和其他视图技术集成。
可定义的本地化,时区和主题的解析,无论是否含有Spring标签库都支持JSP,支持JSTL,在不需要额外的连接的情况下支持Velocity,等等。
一个简单且强大的JSP标签库,称作Spring标签库,提供了数据绑定和主题的特性。自定义的标签允许在标记代码上最大限度的灵活性。更多关于标签库描述的信息,请看附录43章,spring JSP Tag Library。
JSP形式的标签库在Spring 2.0中引入,这让编写JSP形式的页面变得更加简单。更多关于标签库的描述,请看附录44章,spring-form JSP Tag Library
* bean生命周期范围可以为当前HTTP请求或是HTTPSession
。这不是Spring MVC自身的特性,而是Spring MVC使用的WebApplicationContext
容器的。这些bean的范围在7.5.4节,"Request, saession, global,application, and WebSocket scopes"中描述。
非Spring的MVC实现可能更适合一些项目。许多团队希望利用他们已有的在技巧和工具方面的资本,比如使用JSF。
如果你不想要使用Spring Web MVC,但是打算利用Spring提供的其他方案,你可以将你选择的web MVC框架轻易的集成进Spring。通过ContextLoaderListner
来启动Spring根应用成程序上下文,并通过含有ServletContext
属性的对象(或是其他的Spring辅助方法)来访问它。没有“插入”是侵入性的,因此不需要专门的继承。从web层的角度看,你只是将Spring用作为库,根应用程序上下文实例时入口。
即使不是用Spring Web MVC,你也可以注册bean和Spring的服务。在这种情况下,Spring不会和其他web框架竞争。它可以实现一些纯Web MVC框架做不到的事情,比如配置数据访问和事物处理。因此你可以通过Spring中间层或是数据访问层来丰富你的应用,即使你只想使用JDBC或是Hibernate的事物抽象。